/**
 * 
 */
package com.gr.staffpm.tasks.dao;

import java.util.Calendar;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.gr.staffpm.dao.HibernateDao;
import com.gr.staffpm.datatypes.Project;
import com.gr.staffpm.datatypes.Task;
import com.gr.staffpm.datatypes.TaskQueue;
import com.gr.staffpm.datatypes.User;


/**
 * @author Graham Rhodes 15 Jan 2011 19:22:58
 */
@Repository("taskQueueDAO")
@SuppressWarnings("unchecked")
public class HibernateTaskQueueDAO extends HibernateDao implements TaskQueueDAO {

    private static final long serialVersionUID = 1L;

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#getQueuedTask(int)
     */
    @Override
    public TaskQueue getQueuedTask(int id) {
        return (TaskQueue) getSession().load(TaskQueue.class, id);
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#getQueuedTaskByTaskId(int)
     */
    @Override
    public TaskQueue getQueuedTaskByTaskId(int id) {
        Criteria crit = getSession().createCriteria(TaskQueue.class);
        crit.createCriteria(TaskQueue.TASK).add(Restrictions.eq(Task.ID, id));
        return (TaskQueue) crit.uniqueResult();
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#getQueuedTasksForProject(int)
     */
    @Override
    public List<TaskQueue> getQueuedTasksForProject(Project project) {
        Criteria crit = getSession().createCriteria(TaskQueue.class);
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        crit.createCriteria(TaskQueue.TASK).add(Restrictions.eq(Task.PROJECT, project));
        return crit.list();
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#getQueuedTasksForManager(int)
     */
    @Override
    public List<TaskQueue> getQueuedTasksForManager(User manager) {
        Criteria crit = getSession().createCriteria(TaskQueue.class);
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        crit.add(Restrictions.eq(TaskQueue.MANAGER, manager));
        List<TaskQueue> queue = crit.list();
        return queue;
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#addTaskToQueue(com.gr.staffpm.datatypes.Task, com.gr.staffpm.datatypes.User, java.lang.String)
     */
    @Override
    public void addTaskToQueue(Task task, User currentUser, User manager, String comment) {
        TaskQueue queuedTask = new TaskQueue();
        queuedTask.setCreated(Calendar.getInstance().getTime());
        queuedTask.setCreatedBy(currentUser);
        queuedTask.setTask(task);
        queuedTask.setManager(manager);
        queuedTask.setComment(comment);
        getSession().saveOrUpdate(queuedTask);
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#getQueuedTasksForManager(int, java.lang.String, boolean)
     */
    @Override
    public List<TaskQueue> getQueuedTasksForManager(User manager, String property, boolean ascending) {
        Criteria crit = getSession().createCriteria(TaskQueue.class);
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        crit.add(Restrictions.eq(TaskQueue.MANAGER, manager));
        Order order;

        if (property == null) {
            if (ascending)
                order = Order.asc(TaskQueue.CREATED);
            else
                order = Order.desc(TaskQueue.CREATED);
        } else {
            if (ascending)
                order = Order.asc(property);
            else
                order = Order.desc(property);
        }

        crit.addOrder(order);
        return crit.list();
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#removeTaskFromQueue(com.gr.staffpm.datatypes.TaskQueue)
     */
    @Override
    public void removeTaskFromQueue(TaskQueue queuedTask) {
        getSession().delete(queuedTask);
    }

    /* (non-Javadoc)
     * @see com.gr.staffpm.tasks.dao.TaskQueueDAO#removeTaskFromQueue(com.gr.staffpm.datatypes.Task)
     */
    @Override
    public void removeTaskFromQueue(Task task) {
        Criteria crit = getSession().createCriteria(TaskQueue.class);
        crit.add(Restrictions.eq(TaskQueue.TASK, task));
        TaskQueue queuedTask = (TaskQueue) crit.uniqueResult();
        getSession().delete(queuedTask);
    }

}
